#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <Python.h>

int contagem;

int comp(const int * a,const int * b)
{
        if (*a==*b){
                return 0;
        }
        else{
                if (*a < *b){
                        return -1;
                }
                else{
                        return 1;
                }
        }
}

int *sort_int(int lista[10]){

        int sorting[10]; 
        int i;

        
        for(i = 0; i < 10; i++ ){
                sorting[i] = lista[i];
        }

        qsort(sorting,10,sizeof(int[10]),comp) ;

        for (i=0; i < 10 ; i++){
                lista[i] = sorting[i] ;
        }       
	
        return lista;
}

int writefile(PyObject* lista, char ano[5]){

        FILE *f1;
        int i;

        f1 = fopen("Lista_estab_por_ano.txt", "w");
        fprintf(f1, "Ano: %s \n", ano);

        for(i = 0; i < PyList_Size(lista); i++){
                fprintf(f1, "Estabelecimento: %s\n ", PyString_AsString(PyList_GetItem(lista, i)));
        }
        
        fclose(f1);

        return ;

}

int writefile1(int lista[10], char estab[40]){

        FILE *f1;
        int i;

        f1 = fopen("Lista_sairam.txt", "w");
        fprintf(f1, "Estabelecimento: %s\n " , estab);
        
        for(i = 1; i < 10; i++){
                fprintf(f1, "Sairam %d docentes.\n " , lista[i]);
        }
        
        fclose(f1);

        return ;

}

int writefile2(PyObject* lista, char grau[20], char ano[3]){

        FILE *f1;
        int i;
        f1 = fopen("Lista_holderDegree_por_ano.txt", "w");

        fprintf(f1, "Grau: %s \n", grau);
        fprintf(f1, "Ano: %s \n", ano);
        for(i = 0; i < PyList_Size(lista); i++){
                fprintf(f1, "Docente: %s \n", PyString_AsString(PyList_GetItem(lista, i)));
        }
        
        fclose(f1);
        
        return ;

}

int writefile3(int lista[10], char estab[40]){

        FILE *f1;
        int i;

        f1 = fopen("Lista_entraram.txt", "w");
        fprintf(f1, "Estabelecimento: %s\n " , estab);
        
        for(i = 1; i < 10; i++){
                fprintf(f1, "Sairam %d docentes.\n " , lista[i]);
        }
        
        fclose(f1);

        return ;

}

int writefile4(char ano[5], char estab[40]){

	FILE *f1;
	
	f1 = fopen("Contagem_ano_estab.txt", "w");

	fprintf(f1, "O numero total de docentes no ano %s e no estabelecimento %s é %d\n",ano , estab, contagem);
	
	fclose(f1);

	return ;

}

int writefile5(char ano[5], char grau[20], char estab[40]){

	FILE *f1;
	
	f1 = fopen("Contagem_ano_estab_grau.txt", "w");

	fprintf(f1, "O numero total de docentes no ano %s, com o grau %s e no estabelecimento %s é %d\n",ano , grau, estab, contagem);
	
	fclose(f1);

	return ;

}

int writefile6(char ano[5], char grau[20]){

	FILE *f1;
	
	f1 = fopen("Contagem_ano_grau.txt", "w");

	fprintf(f1, "O numero total de docentes no ano %s e com o grau %s é %d\n",ano , grau, contagem);
	
	fclose(f1);

	return ;

}

int writefile7(char ano[5]){

	FILE *f1;
	
	f1 = fopen("Contagem_ano.txt", "w");

	fprintf(f1, "O numero total de docentes no ano %s é %d\n",ano , contagem);
	
	fclose(f1);

	return ;

}

static int callback(PyObject* lista, int argc, char **argv, char **azColName){

        PyList_Append(lista, PyString_FromString(argv[0]));
        return 0;
        
}

static int callback1(void* NotUsed, int argc, char **argv, char **azColName){

	contagem = atoi( argv[0] ? argv[0] : "NULL");
	
	return 0;
}


int count_year(int ano, char estab[40]){
        char* name_db= "rebides.db";
        sqlite3 *db;  
        char *zErrMsg = 0;
        int rc;
        char* query;
        char* sAno;
        char* cond;
		

        query = (char *) malloc(sizeof (char[200]));
        cond = (char *) malloc(sizeof (char[80]));
        sAno = (char *) malloc(sizeof (char));

        strcpy(query, "SELECT COUNT(DISTINCT docente) FROM fichas_docencia where ano = ");
        strcpy(cond, " AND estabelecimento = ");
        sprintf(sAno, "%d", ano);
        strcat(query, sAno);
        strcat(cond, estab);
        strcat(query, cond);

        rc = sqlite3_open(name_db, &db);

        rc = sqlite3_exec(db, query, callback1, 0, &zErrMsg);
        if( rc!=SQLITE_OK ){
                fprintf(stderr, "SQL error: %s\n", zErrMsg);
                sqlite3_free(zErrMsg);
        }
        sqlite3_close(db);

        free(query);
        free(sAno);
        free(cond);
        
        return contagem;
}

int *list_leaving_docentes(char estab[40]){
        int lista[15];        
        int i;
        int year1;
        int year2;
        int diference;          
        
        for(i = 11; i > 1; i--){
        	year1 = count_year(i-1, estab);
            year2 = count_year(i, estab);
            diference = year1 - year2;

			if(diference > 0){	
				lista[i] = diference;			
			}
			else{
				lista[i] = 0;
			}
		}
		
        writefile1(lista, estab);	
	

        return  lista;
}

int* list_entering_docentes(char estab[40]){
      	int lista[15];        
        int i;
        int year1;
        int year2;
        int diference;          
        
        for(i = 11; i > 0; i--){
        	year1 = count_year(i-1, estab);
            year2 = count_year(i, estab);
            diference = year2 - year1;

			if(diference > 0){	
				lista[i] = diference;			
			}
			else{
				lista[i] = 0;
			}
		}

	
        writefile3(lista, estab);	
	

        return  lista;
}

int count_per_year(int ano){
       	char* name_db= "rebides.db";
        sqlite3 *db;  
        char *zErrMsg = 0;
        int rc;
        char* query;
        char* sAno;

        query = (char *) malloc(sizeof (char[100]));
        sAno = (char *) malloc(sizeof (char));

        strcpy(query, "SELECT COUNT(DISTINCT docente) FROM fichas_docencia where ano =");
        sprintf(sAno, "%d", ano);
        strcat(query, sAno);

        printf("Ano : %s \n", sAno);
        printf("Query : %s \n", query);

        rc = sqlite3_open(name_db, &db);

        rc = sqlite3_exec(db, query, callback1, 0, &zErrMsg);
        if( rc!=SQLITE_OK ){
                fprintf(stderr, "SQL error: %s\n", zErrMsg);
                sqlite3_free(zErrMsg);
        }
        sqlite3_close(db);

		writefile7(sAno);
	
        free(query);
        free(sAno);
        
        return contagem;
}

int count_per_year_degree(int ano, char grau[20]){
        char* name_db= "rebides.db";
        sqlite3 *db;  
        char *zErrMsg = 0;
        int rc;
        char* query;
        char* cond;
        char* sAno;

        query = (char *) malloc(sizeof (char[200]));
        cond = (char *) malloc(sizeof (char[50]));
        sAno = (char *) malloc(sizeof (char));
        

        strcpy(query, "SELECT COUNT(DISTINCT docente) FROM fichas_docencia where ano = ");
        strcpy(cond, " AND grau = ");
        sprintf(sAno, "%d", ano);
        strcat(query, sAno);
        strcat(cond, grau);
        strcat(query, cond);

        printf("Ano : %s \n", sAno);
        printf("Grau : %s \n", grau);
        printf("Query : %s \n", query);

        rc = sqlite3_open(name_db, &db);

        rc = sqlite3_exec(db, query, callback1, 0, &zErrMsg);
        if( rc!=SQLITE_OK ){
                fprintf(stderr, "SQL error: %s\n", zErrMsg);
                sqlite3_free(zErrMsg);
        }
        sqlite3_close(db);

		writefile6(sAno, grau);
		
        free(query);
        free(cond);
        free(sAno);
        
        
        return contagem;
}       

int count_per_year_degree_estab(int ano, char grau[20], char estab[40]){
        char* name_db= "rebides.db";
        sqlite3 *db;  
        char *zErrMsg = 0;
        int rc;
        char* query;
        char* cond1;
        char* cond2;
        char* sAno;

        query = (char *) malloc(sizeof (char[300]));
        cond1 = (char *) malloc(sizeof (char[50]));
        cond2 = (char *) malloc(sizeof (char[80]));
        sAno = (char *) malloc(sizeof (char));

        strcpy(query, "SELECT COUNT(DISTINCT docente) FROM fichas_docencia where ano = ");
        strcpy(cond1, " AND grau = ");
        strcpy(cond2, " AND estabelecimento = ");
        sprintf(sAno, "%d", ano);
        strcat(query, sAno);
        strcat(cond1, grau);
        strcat(cond2, estab);
        strcat(query, cond1);
        strcat(query, cond2);

        printf("Ano : %s \n", sAno);
        printf("Grau : %s \n", grau);
        printf("Estabeleciemtno: %s \n", estab);
        printf("Query : %s \n", query);

        rc = sqlite3_open(name_db, &db);
 
        rc = sqlite3_exec(db, query, callback1, 0, &zErrMsg);
        if( rc!=SQLITE_OK ){
                fprintf(stderr, "SQL error: %s\n", zErrMsg);
                sqlite3_free(zErrMsg);
        }
        sqlite3_close(db);

		writefile5(sAno, grau, estab);
		
        free(query);
        free(cond1);
        free(cond2);
        free(sAno);
        
        return contagem;
}

int count_per_year_estab(int ano, char estab[40]){
        char* name_db= "rebides.db";
        sqlite3 *db;  
        char *zErrMsg = 0;
        int rc;
        char* query;
        char* cond;
        char* sAno;


        query = (char *) malloc(sizeof (char[200]));
        cond = (char *) malloc(sizeof (char[60]));
        sAno = (char *) malloc(sizeof (char));

        strcpy(query, "SELECT COUNT(DISTINCT docente) FROM fichas_docencia where ano = ");
        strcpy(cond, " AND estabelecimento = ");
        sprintf(sAno, "%d", ano);
        strcat(query, sAno);
        strcat(cond, estab);
        strcat(query, cond);

        printf("Ano : %s \n", sAno);
        printf("Estabelecimento : %s \n", estab);
        printf("Query : %s \n", query);

        rc = sqlite3_open(name_db, &db);

        rc = sqlite3_exec(db, query, callback1, 0, &zErrMsg);
        if( rc!=SQLITE_OK ){
                fprintf(stderr, "SQL error: %s\n", zErrMsg);
                sqlite3_free(zErrMsg);
        }
        
        sqlite3_close(db);

		writefile4 (sAno, estab);
		
        free(query);
        free(cond);
        free(sAno);
        
        return contagem;
}

PyObject* list_estab_per_year(int ano){
        PyObject* lista = PyList_New(0);
        char* name_db= "rebides.db";
        sqlite3 *db;  
        char *zErrMsg = 0;
        int rc;
        char* query;
        char* sAno;

        query = (char *) malloc(sizeof (char[100]));
        sAno = (char *) malloc(sizeof (char));

        strcpy(query, "SELECT DISTINCT estabelecimento FROM fichas_docencia where ano=");
        sprintf(sAno, "%d", ano);
        strcat(query, sAno);

        printf("Ano : %s \n", sAno);
        printf("Query : %s \n", query);

        rc = sqlite3_open(name_db, &db);

        rc = sqlite3_exec(db, query, callback, lista, &zErrMsg);
        if( rc!=SQLITE_OK ){
                fprintf(stderr, "SQL error: %s\n", zErrMsg);
                sqlite3_free(zErrMsg);
        }
        sqlite3_close(db);

        writefile(lista, sAno);
        
        free(sAno);
        free(query);

        
        return  lista;
}

PyObject* list_holderDegree_per_year(int ano, char grau[20]){
        PyObject* lista = PyList_New(0);
        char* name_db= "rebides.db";
        sqlite3 *db;  
        char *zErrMsg = 0;
        int rc;
        char* query;
        char* sAno;
        char* cond;

        query = (char *) malloc(sizeof (char[100]));
        cond = (char *) malloc(sizeof (char[50]));
        sAno = (char *) malloc(sizeof (char));

        strcpy(query, "SELECT DISTINCT docente FROM fichas_docencia where ano = ");
        strcpy(cond, " AND grau = ");
        sprintf(sAno, "%d", ano);
        strcat(query, sAno);
        strcat(cond, grau);
        strcat(query, cond);

        printf("Ano : %s \n", sAno);
        printf("Grau : %s \n", grau);
        printf("Query : %s \n", query);

        rc = sqlite3_open(name_db, &db);

        rc = sqlite3_exec(db, query, callback, lista, &zErrMsg);
        if( rc!=SQLITE_OK ){
                fprintf(stderr, "SQL error: %s\n", zErrMsg);
                sqlite3_free(zErrMsg);
        }
        sqlite3_close(db);

        writefile2(lista, grau, sAno);  
        
        free(query);
        free(sAno);
        free(cond);

        
        return  lista;
}

int main(){

		int a = count_per_year(0);
		int b = count_per_year_estab(0, "'Escola Naval' " );
		int c = count_per_year_degree(0, "'Licenciatura' " );
		int d = count_per_year_degree_estab(0, "'Licenciatura' ", "'Escola Naval' ");
        PyObject* e = list_estab_per_year(0);
        PyObject* f = list_holderDegree_per_year(0, "'Licenciatura'");
		int *h = list_entering_docentes(" 'Escola Naval'");
		int *g = list_leaving_docentes(" 'Escola Naval'");



        return 0;
        
}
